from langchain_openai import OpenAIEmbeddings

from config.load_key import load_key

from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# 文本向量化
embedding_model = OpenAIEmbeddings(
    model="Qwen/Qwen3-Embedding-0.6B",
    api_key=load_key("siliconflow_api_key"),
    base_url=load_key("siliconflow_base_url"),
)

text = "你好，这是一个测试请求"
query_result = embedding_model.embed_query(text)
print(query_result)
print(len(query_result))


# 通过向量计算文本相似度

# 定义两个文本
text1 = "我喜欢吃苹果"
text2 = "我最喜欢吃的水果是苹果"
text3 = "今天天气不错"

# 计算文本向量
vector1 = np.array(embedding_model.embed_query(text1)).reshape(1, -1)
vector2 = np.array(embedding_model.embed_query(text2)).reshape(1, -1)
vector3 = np.array(embedding_model.embed_query(text3)).reshape(1, -1)

# 计算余弦相似度
print(cosine_similarity(vector1, vector2))
similarity12 = cosine_similarity(vector1, vector2)[0][0]
similarity13 = cosine_similarity(vector1, vector3)[0][0]
similarity23 = cosine_similarity(vector2, vector3)[0][0]

print(f"\"{text1}\" 与 \"{text2}\" 相似度：{similarity12:.4f}")
print(f"\"{text1}\" 与 \"{text3}\" 相似度：{similarity13:.4f}")
print(f"\"{text2}\" 与 \"{text3}\" 相似度：{similarity23:.4f}")

"""
语义相似度就是大模型理解“语言”的基础

要注意，计算语义相似度的算法其实有很多种，比如有余弦相似度，欧氏距离，曼哈顿距离，等等，不同算法得到的分数含义也是不同的，
例如，余弦相似度得分在-1到1之间，得分越高，语义越相似。而欧氏距离得分在0到正无穷之间，得分越低，表示语义越相似。
"""